/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package suministros.ejb30.DAO;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.annotation.Resource;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.PersistenceUnit;
import javax.persistence.Query;
import javax.sql.DataSource;
import suministros.ejb30.TO.DiasPagoMesTO;
import suministros.ejb30.entity.AreaEmpresa;
import suministros.ejb30.entity.CargoEmpresa;
import suministros.ejb30.entity.Persona;
import suministros.ejb30.entity.TipoTrabajador;
import suministros.ejb30.entity.Trabajador;
import suministros.ejb30.helper.Utiles_Convertir;

/**
 *
 * @author Administrador
 */
@Stateless
public class RRHHGestionTrabajadoresDAO implements RRHHGestionTrabajadoresDAOLocal {

     @PersistenceUnit(unitName="suministros-pu")
     EntityManagerFactory emf;

    EntityManager em;

     @Resource(name="jdbc/Administracion")
    DataSource dsAdministracion;

     @PostConstruct
      public void inicializaBean()
      {
        this.em = this.emf.createEntityManager();
      }

    @PreDestroy
      public void finalizaBean() {
        this.em.close();
      }
    
    public boolean insertaTrabajadorPersona(Trabajador trabajador, Persona persona) throws Exception {
          boolean retorno = false;
         EntityTransaction tx = this.em.getTransaction();
        tx.begin();

          try {
               this.em.merge(persona);
              this.em.merge(trabajador);

              /*Trabajador t_persist = this.em.find(Trabajador.class, trabajador.getDni());
                Persona p_persist = this.em.find(Persona.class,persona.getCodigoPersona());
                if(t_persist != null && p_persist!=null){
                    this.em.remove(t_persist);
                     this.em.remove(p_persist);
                      this.em.flush();
                }
                this.em.persist(persona);
                this.em.persist(trabajador);*/
              this.em.flush();
              tx.commit();
              retorno=true;
          } catch (Exception e) {
                  tx.rollback();
                  throw e;
            }
        return retorno;
    }

   
    public Trabajador getTrabajador(String codigo) throws Exception {
        return this.em.find(Trabajador.class, codigo);
    }

    public Persona getPersona(String codigo) throws Exception {
        return  this.em.find(Persona.class,codigo);
    }

    public List<TipoTrabajador> getListaTipoTrabajador() throws Exception {
         return this.em.createNamedQuery("TipoTrabajador.findAll").getResultList();
    }

    public List<CargoEmpresa> getListaCargoEmpresa() throws Exception {
         return this.em.createNamedQuery("CargoEmpresa.findAll").getResultList();
    }
    public List<AreaEmpresa> getListaAreaEmpresa() throws Exception {
         return this.em.createNamedQuery("AreaEmpresa.findAll").getResultList();
    }

    public AreaEmpresa getAreaEmpresa(int codigo) throws Exception {
        return this.em.find(AreaEmpresa.class, codigo);
    }

    public CargoEmpresa getCargoEmpresa(int codigo) throws Exception {
        return this.em.find(CargoEmpresa.class, codigo);
    }

     public boolean insertaArea(AreaEmpresa area)throws Exception{

          boolean retorno = false;
         EntityTransaction tx = this.em.getTransaction();
        tx.begin();

          try {
             if(area.getCodArea()==null){
                  this.em.persist(area);
              }
              else{
                  AreaEmpresa cambio_persist = this.em.find(AreaEmpresa.class,area.getCodArea());
                  cambio_persist.setNomArea(area.getNomArea());
                  this.em.merge(cambio_persist);
              }
              
              this.em.flush();
              tx.commit();
              retorno=true;
          } catch (Exception e) {
                  tx.rollback();
                  throw e;
            }
        return retorno;

     }

      public boolean insertaCargo(CargoEmpresa cargo)throws Exception{

          boolean retorno = false;
         EntityTransaction tx = this.em.getTransaction();
         tx.begin();

          try {
              if(cargo.getCodCargo()==null){
                  this.em.persist(cargo);
              }
              else{
                  CargoEmpresa cambio_persist = this.em.find(CargoEmpresa.class,cargo.getCodCargo());
                  cambio_persist.setNomCargo(cargo.getNomCargo());
                  this.em.merge(cambio_persist);
              }
                  
              this.em.flush();
              tx.commit();
              retorno=true;
          } catch (Exception e) {
                  tx.rollback();
                  throw e;
            }
        return retorno;

     }

    public List<DiasPagoMesTO> getPagoMes(String anio, String mes, String dni) throws Exception {
      
        Query consulta =this.em.createNativeQuery("select dpm.ano,dpm.mes,dpm.dni,dpm.dias,pr.ap_paterno+' '+pr.ap_materno+','+pr.nombre from dias_pagar_mes dpm inner join persona pr on dpm.dni=pr.codigo_persona where dpm.ano='"+anio+"' and dpm.mes='"+mes+"' and dpm.dni='"+dni+"'");
        return Utiles_Convertir.convertirToBeanBinding_DiasPagoMes(consulta.getResultList());
    }

    public boolean actualizarPagoMes(List<DiasPagoMesTO> lista) throws Exception {
        Connection cn =null;
        PreparedStatement st=null;
        String plantilla="";
        cn = dsAdministracion.getConnection();
        for (DiasPagoMesTO diasPagoMesTO : lista) {
             System.out.println(diasPagoMesTO.getAnio()+"-"+diasPagoMesTO.getMes()+"-"+diasPagoMesTO.getDni()+"-"+diasPagoMesTO.getDias());
             plantilla = "update dias_pagar_mes set dias=? where ano=? and mes=? and dni=?";
             st = cn.prepareStatement(plantilla);
             st.setInt(1, diasPagoMesTO.getDias());
             st.setString(2, diasPagoMesTO.getAnio());
             st.setString(3, diasPagoMesTO.getMes());
             st.setString(4, diasPagoMesTO.getDni());
             System.out.println(">"+st.executeUpdate());
        }
        cn.close();
        return false;
    }

   




    

    
    // Add business logic below. (Right-click in editor and choose
    // "Insert Code > Add Business Method")
 
}
